From 54cb3fc6715df67ec08efceee3e9e5f4dc3ca098 Mon Sep 17 00:00:00 2001 From: parkrrrr Date: Thu, 20 Apr 2006 13:58:10 +0000 Subject: [PATCH] Added 'gpsbabel -h foo' syntax --- gpsbabel/defs.h | 1 + gpsbabel/filter_vecs.c | 21 +++++++++++++++++++++ gpsbabel/filterdefs.h | 1 + gpsbabel/main.c | 17 ++++++++++++++--- gpsbabel/vecs.c | 30 +++++++++++++++++++++++++++++- 5 files changed, 66 insertions(+), 4 deletions(-) diff --git a/gpsbabel/defs.h b/gpsbabel/defs.h index ec15c7d99..8e4880cc4 100644 --- a/gpsbabel/defs.h +++ b/gpsbabel/defs.h @@ -574,6 +574,7 @@ ff_vecs_t *find_vec(char * const, char **); void assign_option(const char *vecname, arglist_t *ap, const char *val); void disp_vec_options(const char *vecname, arglist_t *ap); void disp_vecs(void); +void disp_vec( const char *vecname ); void exit_vecs(void); void disp_formats(int version); const char * name_option(long type); diff --git a/gpsbabel/filter_vecs.c b/gpsbabel/filter_vecs.c index 51dd19244..5840c31bc 100644 --- a/gpsbabel/filter_vecs.c +++ b/gpsbabel/filter_vecs.c @@ -229,6 +229,27 @@ disp_filter_vecs(void) } } +void +disp_filter_vec( const char *vecname ) +{ + fl_vecs_t *vec; + arglist_t *ap; + + for (vec = filter_vec_list; vec->vec; vec++) { + if ( case_ignore_strcmp( vec->name, vecname )) { + continue; + } + printf(" %-20.20s %-50.50s\n", + vec->name, vec->desc); + for (ap = vec->vec->args; ap && ap->argstring; ap++) { + if ( !(ap->argtype & ARGTYPE_HIDDEN )) + printf(" %-18.18s %-.50s %s\n", + ap->argstring, ap->helpstring, + (ap->argtype&ARGTYPE_REQUIRED)?"(required)":""); + } + } +} + static signed int alpha (const void *a, const void *b) { diff --git a/gpsbabel/filterdefs.h b/gpsbabel/filterdefs.h index 19272c362..029786bf8 100644 --- a/gpsbabel/filterdefs.h +++ b/gpsbabel/filterdefs.h @@ -39,6 +39,7 @@ typedef struct filter_vecs { filter_vecs_t * find_filter_vec(char * const, char **); void free_filter_vec(filter_vecs_t *); void disp_filters(int version); +void disp_filter( const char *vecname ); void disp_filter_vecs(void); void exit_filter_vecs(void); diff --git a/gpsbabel/main.c b/gpsbabel/main.c index c0e42693b..3552252b2 100644 --- a/gpsbabel/main.c +++ b/gpsbabel/main.c @@ -28,7 +28,7 @@ #define MYNAME "main" static void -usage(const char *pname, int shorter) +usage(const char *pname, int shorter ) { printf("GPSBabel Version %s. http://www.gpsbabel.org\n\n", gpsbabel_version ); @@ -81,7 +81,13 @@ usage(const char *pname, int shorter) } } - +static void +spec_usage( const char *vec ) { + printf( "\n" ); + disp_vec( vec ); + disp_filter_vec ( vec ); + printf( "\n" ); +} int main(int argc, char *argv[]) @@ -151,7 +157,12 @@ main(int argc, char *argv[]) } if (argv[argn][1] == '?' || argv[argn][1] == 'h') { - usage(argv[0],0); + if ( argn < argc-1 ) { + spec_usage( argv[argn+1] ); + } + else { + usage(argv[0],0); + } exit(0); } diff --git a/gpsbabel/vecs.c b/gpsbabel/vecs.c index 5ae34958d..b72dfbc39 100644 --- a/gpsbabel/vecs.c +++ b/gpsbabel/vecs.c @@ -875,6 +875,7 @@ sort_and_unify_vecs(int *ctp) return svp; } +#define VEC_FMT " %-20.20s %-.50s\n" void disp_vecs(void) @@ -885,7 +886,6 @@ disp_vecs(void) int i = 0; svp = sort_and_unify_vecs(&vc); -#define VEC_FMT " %-20.20s %-.50s\n" for (i=0;ivec->type == ff_type_internal ) { continue; @@ -905,6 +905,34 @@ disp_vecs(void) return; } +void +disp_vec( const char *vecname ) +{ + vecs_t **svp; + arglist_t *ap; + int vc; + int i = 0; + + svp = sort_and_unify_vecs(&vc); + for (i=0;iname, vecname )) { + continue; + } + printf(VEC_FMT, svp[i]->name, svp[i]->desc); + for (ap = svp[i]->vec->args; ap && ap->argstring; ap++) { + if ( !(ap->argtype & ARGTYPE_HIDDEN)) + printf(" %-18.18s %s%-.50s %s\n", + ap->argstring, + (ap->argtype & ARGTYPE_TYPEMASK) == + ARGTYPE_BOOL ? "(0/1) " : "", + ap->helpstring, + (ap->argtype & ARGTYPE_REQUIRED)?"(required)":""); + } + } + xfree (svp); + return; +} + /* * Additional information for V1. * Output format type at front of line. -- 2.30.2